/*
 * 现在让我们看看 Orchard Core 在存储数据时提供了什么实践。在这里您可以看到一个内容部分。
 * 每个内容部分可以附加到一个或多个内容类型。从内容类型您可以创建内容项（所以您有点"实例化"内容类型作为内容项）。
 * 这是 Orchard Core 内容管理中最重要的部分。
 *
 * 这里是一个包含人员一些属性的 PersonPart。我们计划将此内容部分附加到 Person 内容类型，
 * 因此当您创建 Person 内容项时，它将有一个附加的 PersonPart。您还需要在服务提供者中注册此类（请参阅：Startup.cs）。
 */

using OrchardCore.ContentFields.Fields;
using OrchardCore.ContentManagement;
using System;

namespace Ruitu.Edu.TrainingDemo.Models;

/// <summary>
/// 人员内容部分 - 演示 Orchard Core 内容管理的基础概念
/// 
/// 主要用途：
/// - 演示如何创建内容部分
/// - 展示内容部分与内容类型的关系
/// - 演示内容字段的使用
/// 
/// 使用场景：
/// - 需要为内容项添加人员信息
/// - 需要创建可重用的内容结构
/// - 需要展示内容管理的最佳实践
/// 
/// 设计原因：
/// - 利用 Orchard Core 的内容管理框架
/// - 支持 JSON 序列化存储
/// - 提供灵活的内容结构
/// 
/// 设计模式：
/// - 内容部分模式：继承 ContentPart
/// - 组合模式：包含多个属性和字段
/// - 序列化模式：支持 JSON 序列化
/// </summary>
public class PersonPart : ContentPart
{
    /// <summary>
    /// 人员姓名
    /// </summary>
    // ContentPart 被序列化为 JSON 对象，所以在创建属性时需要记住这一点。
    // 有关更多信息，请查看 Json.NET 文档：https://www.newtonsoft.com/json/help/html/Introduction.htm
    public string Name { get; set; }

    /// <summary>
    /// 惯用手
    /// </summary>
    public Handedness Handedness { get; set; }

    /// <summary>
    /// 出生日期（UTC）
    /// </summary>
    public DateTime? BirthDateUtc { get; set; }

    /// <summary>
    /// 个人传记内容字段
    /// </summary>
    // 这是一个内容字段。内容字段类似于内容部分，但是字段是更小的组件，
    // 封装了单个数据的简单编辑器和显示。内容部分可以提供更复杂的功能，
    // 也可以包含一组字段。TextField 是 Orchard 众多内置字段之一。
    // 要使用它，您不需要在部分中为其添加属性（您只需要将其附加到内容类型，
    // 我们从迁移中执行此操作），但拥有这样的属性是访问它的好捷径。
    // 您也不需要实例化它，我们在这里这样做是为了避免在使用内容项时进行空检查，
    // 即使没有使用 IContentManager.LoadAsync() 初始化它。
    public TextField Biography { get; set; } = new();
}

/// <summary>
/// 惯用手枚举
/// </summary>
public enum Handedness
{
    /// <summary>
    /// 右手
    /// </summary>
    Right,

    /// <summary>
    /// 左手
    /// </summary>
    Left,
}

// 下一站：Migrations/PersonMigrations
